package com.bkhech.netty.websocket;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;

/**
 * HeartBeatHandler
 * 心跳处理器
 *  客户端处于连接状态，但并没有消息的收发，针对这种不太活跃的连接（一段时间内没有读写操作，时间可自定义，比如：1小时），
 *  服务器可以去主动断开不活跃的连接，节约服务器的资源。
 *
 * @author guowm
 * @date 2024-11-18
 */
@Slf4j
public class HeartBeatHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        // 判断 evt 是否是 IdleStateEvent (用于触发空闲状态的，包括 读空闲、写空闲、读写空闲)
        if (evt instanceof IdleStateEvent event){
            switch (event.state()) {
                case READER_IDLE -> {
                    // 读空闲不处理，可打印日志
//                    log.info("进入读空闲状态");
                }
                case WRITER_IDLE -> {
                    // 写空闲不处理，可打印日志
//                    log.info("进入写空闲状态");
                }
                default -> {
                    log.info("进入读写空闲状态");
//                    log.error("channel关闭前, clients的数量为：{}", ClientChannelGroup.getInstance().size());
                    Channel channel = ctx.channel();
                    // 关闭无用的 Channel，以防资源浪费
                    channel.close();
//                    log.error("channel关闭后, clients的数量为：{}", ClientChannelGroup.getInstance().size());
                }
            }

        }
    }
}
